<?php
if (function_exists("get_magic_quotes_gpc")) {
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
    foreach ($process as $key => $val) {
        foreach ($val as $k => $v) {
            unset($process[$key][$k]);
            if (is_array($v)) {
                $process[$key][stripslashes($k)] = $v;
                $process[] = &$process[$key][stripslashes($k)];
            } else {
                $process[$key][stripslashes($k)] = stripslashes($v);
            }
        }
    }
    unset($process);
}

if (!function_exists("devdump")) {
    function devdump($data, $exit = 0)
    {
        echo "<pre>";
        print_r($data);
        echo "</pre>";
        $exit && exit;
    }
}

if (!function_exists("vkConsole")) {
    /**
     * Console 打印
     *
     * @param mixed $data
     * @param integer $exit
     * @param boolean $br <true> 是否换行打印
     * @return void
     */
    function vkConsole($data, $exit = false, bool $br = true)
    {
        if ($br) {
            echo "\r\n";
        }
        print_r($data);
        if ($br) {
            echo "\r\n";
        } else {
            echo "\n";
        }
        $exit && exit;
    }
}

if (!function_exists("vkStrLenPlus")) {
    /**
     * 统计字符长度(加强版)
     *
     * @param string $str
     * @return int
     */
    function vkStrLenPlus($str): int
    {
        $i = 0;
        $n = 0;
        $str_length = strlen($str); //字符串的字节数
        while ($i <= $str_length) {
            $temp_str = substr($str, $i, 1);
            $ascnum = ord($temp_str); //得到字符串中第$i位字符的ascii码
            if ($ascnum >= 224) { //如果ASCII位高与224
                $i += 3; //实际Byte计为3
                $n++; //字串长度计1
            } elseif ($ascnum >= 192) { //如果ASCII位高与192，
                $i += 2; //实际Byte计为2
                $n++; //字串长度计1
            } elseif ($ascnum >= 65 && $ascnum <= 90) { //如果是大写字母，
                $i += 1; //实际的Byte数仍计1个
                $n++; //但考虑整体美观，大写字母计成一个高位字符
            } elseif ($ascnum >= 97 && $ascnum <= 122) {
                $i += 1; //实际的Byte数仍计1个
                $n++; //但考虑整体美观，大写字母计成一个高位字符
            } else if ($ascnum > 0) { //其他情况下，半角标点符号
                $i += 1;
                $n++;
            } else {
                $i += 1;
            }
        }
        return $n;
    }
}

if (!function_exists("vkSubstrPlus")) {
    /**
     * (中/英/混合)字符串截取(加强版)
     *
     * @param string $str 待截取字符串
     * @param int $start <0> 从第几个字符(包含)开始截取
     * @param int $len <1> 截取长度
     * @param string $omitted <"..."> 自定义返回文本的后缀，如："..."
     *
     * @return string
     */
    function vkSubStrPlus(string $str, int $start = 0, int $len = 0, string $omitted = "..."): string
    {
        // if (function_exists("mb_substr"))
        //     $slice = mb_substr($str, $start, $len, 'utf-8');
        // elseif (function_exists('iconv_substr')) {
        //     $slice = iconv_substr($str, $start, $len, 'utf-8');
        // } else {
        //     $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
        //     $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
        //     $re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
        //     $re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
        //     preg_match_all($re['utf-8'], $str, $match);
        //     $slice = join("", array_slice($match[0], $start, $len));
        // }
        // return $omitted ? $slice . $omitted : $slice;

        $rstr = ''; //待返回字符串
        $str_length = vkStrLenPlus($str); //字符串的字节数
        // $str_length = strlen( $str ); //字符串的字节数
        $i = 0;
        $n = 0;
        ($start < 0) && $start = $str_length - abs($start);
        if ($len == 0)
            $len = $str_length;
        elseif ($len < 0)
            $len = $str_length - abs($len);

        if (($start + $len) > $str_length) {
            $len = $str_length - $start;
        }
        while (($n < ($start + $len))) {
            $temp_str = substr($str, $i, 1);
            $ascnum = ord($temp_str); //得到字符串中第$i位字符的ascii码
            if ($ascnum >= 224) { //如果ASCII位高与224，
                if ($n >= $start)
                    $rstr = $rstr . substr($str, $i, 3); //根据UTF-8编码规范，将3个连续的字符计为单个字符
                $i += 3; //实际Byte计为3
                $n++; //字串长度计1
            } elseif ($ascnum >= 192) { //如果ASCII位高与192，
                if ($n >= $start)
                    $rstr = $rstr . substr($str, $i, 2); //根据UTF-8编码规范，将2个连续的字符计为单个字符
                $i += 2; //实际Byte计为2
                $n++; //字串长度计1
            } elseif ($ascnum >= 65 && $ascnum <= 90) { //如果是大写字母，
                if ($n >= $start)
                    $rstr = $rstr . substr($str, $i, 1);
                $i++; //实际的Byte数仍计1个
                $n++; //但考虑整体美观，大写字母计成一个高位字符
            } elseif ($ascnum >= 97 && $ascnum <= 122) {
                if ($n >= $start)
                    $rstr = $rstr . substr($str, $i, 1);
                $i++; //实际的Byte数仍计1个
                $n++; //但考虑整体美观，大写字母计成一个高位字符
            } elseif ($ascnum > 0) {
                if ($n >= $start)
                    $rstr = $rstr . substr($str, $i, 1);
                $i++;
                $n++;
            } else { //其他情况下，半角标点符号，
                if ($n >= $start)
                    $rstr = $rstr . substr($str, $i, 1);
                $i++;
                $n += 1; //0.5;
            }
        }
        if ($omitted != "") {
            $omitted = trim($omitted);
        }
        // echo ": i:$i - n:$n";
        return $rstr . $omitted;
    }
}

if (!function_exists("vkGetSuggestion")) {
    /**
     * 获取(最大)相似度文本(不支持中文)
     *
     * @param array $possibilities 查找列表
     * @param string $value 查找文字
     *
     * @return string|null
     */
    function vkGetSuggestion(array $possibilities, string $value): ?string
    {
        $best = null;
        $min = (strlen($value) / 4 + 1) * 10 + .1;
        $possibilities = array_map(function ($item) {
            return $item instanceof \Reflector ? $item->getName() : (string) $item;
        }, $possibilities);
        foreach (array_unique($possibilities) as $item) {
            //if ($item !== $value && ($len = levenshtein($item, $value, 10, 11, 10)) < $min) {
            if ($item !== $value && ($len = levenshtein($item, $value, 10, 11, 10)) > 0 && $len < $min) {
                $min = $len;
                $best = $item;
            }
        }
        return $best;
    }
}

if (!function_exists("vkStrPadPlus")) {

    /**
     * 字符串填充(加强版)
     *
     * @param string $str
     * @param integer $length
     * @param string $padStr
     * @param int $padType
     * @return string
     */
    function vkStrPadPlus(string $str, int $length, string $padStr = " ", $padType = STR_PAD_RIGHT): string
    {
        //探测字符里的中文
        preg_match_all('/[\x7f-\xff]+/', $str, $matches);
        if (!empty($matches[0])) {
            $rel_len = vkStrLenPlus($str);
            //统计中文字的实际个数
            $zh_str_totals = vkStrLenPlus(implode("", $matches[0]));
            //剩下的就是非中文字符个数
            $un_zh_str_totals = $rel_len - $zh_str_totals;
            //console下，一个中文处理为2个字符长度
            $zh_str_totals *= 2;
            //计算字符总长度
            $rel_len = $un_zh_str_totals + $zh_str_totals;
            //生成计算长度的虚拟字符串
            $tmp_txt = str_pad("^&.!", $rel_len, "#");
            //实际字符串替换虚拟字符串（实现还原 外部字符）
            $str = str_replace(
                /* 用需求字符替换掉 常规填充字符中 的虚拟字符*/
                $tmp_txt,
                $str,
                /*常规填充*/
                str_pad($tmp_txt, $length, $padStr, $padType)
            );
            unset($rel_len, $zh_str_totals, $un_zh_str_totals, $tmp_txt);
        } else {
            $str = str_pad($str, $length, $padStr, $padType);
        }
        return $str;
    }
}

if (!function_exists("vkGetTextSamePercent")) {
    /**
     * 计算str1较str2的相似度
     * 
     * @param string $str1
     * @param string|array $str2
     * 
     * @return array[] ['sim'=> xx, 'perc' => xx]
     */
    function vkGetTextSamePercent(string $str1, $str2): array
    {
        $flag = false;
        if (!is_array($str2)) {
            $flag = true;
            $str2 = [$str2];
        }
        $list = [];
        foreach ($str2 as $str) {
            $sim = similar_text($str, $str1, $perc);
            $list[] = [
                'str1' => $str1,
                'str2' => $str,
                'sim' => $sim,
                'perc' => $perc
            ];
        }
        return $flag ? $list[0] : $list;
    }
}
!defined('VIPKWD_MONGODB_LIB_ROOT') && define('VIPKWD_MONGODB_LIB_ROOT', realpath(__DIR__ . '/../'));